﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Data;
using Service;
using System.Web.Security;
using RegistroMascotas.Modelo;
using System.Net.Mail;
using System.Net;

namespace RegistroMascotas
{
    public partial class index : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                if (User.Identity.IsAuthenticated)
                    switch (obtenerTipoUsuario(User.Identity.Name))
                    {
                        case 1:
                            Response.Redirect("~/login-admin.aspx");
                            break;
                        case 2:
                            Response.Redirect("~/login-municipio.aspx");
                            break;
                        case 3:
                            Response.Redirect("~/login-dueño.aspx");
                            break;
                        case 4:
                            Response.Redirect("~/login-veterinario.aspx");
                            break;
                        default:
                            break;
                    }
            // si esta autenticad y con Name sacas el nombre
        }

        protected void btnInicioSesion_Click(object sender, EventArgs e)
        {
            if (iniciarSesion(in_usu.Text, in_pass.Text))
            {
                Session["NickName"] = in_usu.Text;

                switch(obtenerTipoUsuario(in_usu.Text)){
                    case 0:
                        lblMsjErrorLogin.Text = "El usuario ingresado no contiene un tipo de usuario.";
                        break;
                    case 1:
                        Session["TipoUsuario"] = "Admin";
                        Autenticar(in_usu.Text,"~/login-admin.aspx",this.Page);
                        break;
                    case 2:
                        Session["TipoUsuario"] = "Centro";
                        Autenticar(in_usu.Text, "~/login-municipio.aspx", this.Page);
                        break;
                    case 3:
                        Session["TipoUsuario"] = "Dueño";
                        Autenticar(in_usu.Text, "~/login-dueño.aspx", this.Page);
                        break;
                    case 4:
                        Session["TipoUsuario"] = "Veterinario";
                        Autenticar(in_usu.Text, "~/login-veterinario.aspx", this.Page);
                        break;
                }                
            }
            else {
                lblMsjErrorLogin.Text = "El usuario que trato de ingresar no existe. Verifique los datos ingresados.";
                lblMsjErrorLogin.CssClass = "errores";
            }
            
        }        

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            Mascota m = null;

            try
            {
                m =GestorDeBusqueda.obtenerMascotaPorCodigoAlternativo(in_cod.Text);

                if (m != null)
                {

                    if (m.Estado != EstadoMascota.Perdido.ToString() && m.Estado != EstadoMascota.En_Adopción.ToString())
                    {
                        throw new Exception("Para proteger los datos de nuestros usuario sólo serán mostrados, si la mascota que busca está perdida o en estado de adopción.");
                    }

                    Session["Mascota"] = m;
                    Response.Redirect("~/datos-animal.aspx?codigo=" + in_cod.Text, true);
                }
                else {
                    throw new Exception("El código ingresado no pertenece a ninguna mascota registrada.");
                }                
            }
            catch (Exception ex)
            {            
                lblMsjError.Text = ex.Message;
                lblMsjError.CssClass = "errores";
            }
        }

        private static void Autenticar(string usuario, string redirigirUrl, Page pagina)
        {
            FormsAuthentication.Initialize();
            FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, usuario, DateTime.Now, DateTime.Now.AddMinutes(30), false, @"", FormsAuthentication.FormsCookiePath);

            pagina.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat)));
            pagina.Response.Redirect(redirigirUrl);
        }

        private bool iniciarSesion(string userName, string userPass)
        {
            bool resultado = false;

            try
            {
                resultado = PersonaDAO.iniciarSesion(userName, userPass);
            }
            catch (Exception ex)
            {
                lblMsjErrorLogin.Text = ex.Message;
                lblMsjErrorLogin.CssClass = "errores";
            }
            return resultado;
        }

        private int obtenerTipoUsuario(string userName)
        {
            string resultado = "";
            int tipo = 0;

            try
            {
                resultado = PersonaDAO.traerTipoUsuarioPorUsuario(userName);

                if (resultado == "Admin")
                {
                    tipo = 1;
                }
                else if (resultado == "Centro")
                {
                    tipo = 2;
                }
                else if (resultado == "Dueño")
                {
                    tipo = 3;
                }
                else
                {
                    tipo = 4;
                }
            }
            catch (Exception ex)
            {
                lblMsjErrorLogin.Text = ex.Message;
                lblMsjErrorLogin.CssClass = "errores";
            }
            return tipo;
        }

        protected void hlContraseña_Click(object sender, EventArgs e)
        {
            Persona usuarioOlvidadizo = null;
            bool exito = false;

            if (in_usu.Text == "")
            {
                lblMsjErrorLogin.Text = "Ingrese el nombre de usuario para recuperar su contraseña.";
                lblMsjErrorLogin.CssClass = "errores";
            }
            else {
                usuarioOlvidadizo = (Persona)PersonaDAO.traerDatosUsuario(in_usu.Text);

                if (usuarioOlvidadizo != null)
                {
                    exito = mandarMail(usuarioOlvidadizo);
                    lblMsjErrorLogin.Text = "Revise su casilla de mail para reestablecer su contraseña.";
                    lblMsjErrorLogin.CssClass = "";
                }
                else {
                    lblMsjErrorLogin.Text = "El usuario ingresado no existe en el sistema.";
                    lblMsjErrorLogin.CssClass = "errores";
                }
                
            }
        }

        private bool mandarMail(Persona p) {

            bool exito = false;
            //creamos el objeto mail
            MailMessage msg = new MailMessage();

            msg.To.Add(new MailAddress(p.Mail));
            msg.From = new MailAddress("info@renacmas.com.ar");
            msg.Subject = "Registro Provincial de Mascotas: Reestablecimiento de contraseña.";
            msg.Body = "Señor/a " + p.Nombre + ": hemos recibido una petición de reestablecimiento de contraseña. Usted ha sido registrado con la contraseña:" + p.Contraseña + ". Si usted no ha realizado la petición ignore este mail. \n Reg Nac Mas.";

            SmtpClient smtp = new SmtpClient();

            smtp.Credentials = new NetworkCredential(msg.From.Address, "renacmas000");

            smtp.Host = "mail.renacmas.com.ar";//"smtp.live.com"; El servidor de hotmail
            smtp.Port = 25;
            smtp.EnableSsl = false;

            try
            {
                smtp.Send(msg);
                exito = true;
                msg.Dispose();
            }
            catch (Exception ex)
            {
                lblMsjErrorLogin.Text = ex.Message;
            }

            return exito;
        }

    }
}